2007年07月01日
川俣晶の縁側ソフトウェア技術雑記 total 4246 count

C# 2.0で匿名メソッドを使う簡潔さと柔軟性を実感する瞬間!!

Written By: 川俣 晶連絡先

 こういうコードがありました。

items.Add(new SimpleMenuItem("掲示板を読む [未読" + BBS.Get未読Count() + "件]", readbbs));

items.Add(new SimpleMenuItem("掲示板 全未読一気読み", readbbsIkki));

 ここで、readbbsとreadbbsIkkiはどちらもメソッドです。

 しかし、この2つはほとんど同じなので、1つのメソッドにまとめたいと思いました。

 一気読みするか否かをbool引数で渡すようにしたいと思いますが、SimpleMenuItemのコンストラクタの第2引数のデリゲート型には引数の定義がありません。まあ、定義があっても渡しようが無いですけどね。このメソッドを呼ぶのはSimpleMenuItemのインスタンスであって、このコードが書かれたメソッドではありませんから。

 ではどう書き直せば良い?

 一瞬、簡潔に書けないか……と思いそうになりましたが、よく考えると小さな匿名メソッドを1つ挟めば簡単に解決できることに気付きました。

items.Add(new SimpleMenuItem("掲示板を読む [未読" + BBS.Get未読Count() + "件]",

    delegate() { return readbbs(false); }));

items.Add(new SimpleMenuItem("掲示板 全未読一気読み",

    delegate() { return readbbs(true); }));

 あまりにシンプルな解決策なので、我ながら半信半疑で書いてみたら意図通りに通りました。

 うーん、こんなコーディングに慣れたら、もう匿名メソッド/関数の無い言語には戻れない身体になってしまいそう……。

余談・論よりソース §

 オータムマガジンを見ていれば分かると思いますが、最近もうオータムマガジンで理屈を語っていません。なぜかといえば、言葉でいくら理屈を語ったところで、それは本当の意味での説得力にならないと思うからです。本当なら、言葉を語るよりもソースを書くべきなのですが、この10年ほどはどうしても上手くソースを書けませんでした。しかし、今は書けます。なので、能書きを垂れてる時間があればコードを書く……という原則をやっと実践できるようになってきました。

 というわけで、この文章は理屈を述べるものではなく、ちょっと冴えた良いソース(と自分が思ったもの)を他人に見せたくなったから書いたものなのです。